package stack;

import java.util.Deque;
import java.util.LinkedList;

class 字符串解码_394 {
    public String decodeString(String s) {
        // 遇到[开始把前面一个入栈  以及后面的
        Deque<String> cStack = new LinkedList<>();
        Deque<Integer> iStack = new LinkedList<>();

        String res = ""; // 存储本次[] 中的字符串
        int num = 0;     //  存储本次[ 前面的倍数
        for (char c : s.toCharArray()) {
            if (c >= '0' && c <= '9') { // 是数字
                num = num * 10 + (c - '0'); // 23[ab] 这种  数字是23倍
            } else if (c == '[') {  // [ 将之前的字符串和倍数入栈保存
                cStack.push(res);
                iStack.push(num);
                res = "";
                num = 0;
            } else if (c == ']') { // ] 用数字栈顶数字来倍化 [] 中的元素
                String tmpRes = res;
                final int repeat = iStack.pop() - 1;
                for (int i = 0; i < repeat; i++) {
                    tmpRes = tmpRes + res;
                }
                res = cStack.pop() + tmpRes; //加上 数字前面的字符串 没有就是 ""
            } else {
                res = res + c;
            }
        }
        return res;
    }
}
